package de.is24.util.monitoring.spring; import de.is24.util.monitoring.InApplicationMonitor; import de.is24.util.monitoring.InApplicationMonitorRule; import de.is24.util.monitoring.SimpleStateValueProvider; import org.apache.log4j.Appender; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.varia.NullAppender; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.support.GenericApplicationContext; import java.util.ArrayList; import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; /** * Test for {@link Appmon4jDumper}. * * @author <a href="mailto:sebastian.kirsch@immobilienscout24.de">Sebastian Kirsch</a> */ public class Appmon4jDumperTest { @Rule public final InApplicationMonitorRule inApplicationMonitorRule = new InApplicationMonitorRule(); private Appender appender; private final List<LoggingEvent> loggingEvents = new ArrayList<LoggingEvent>(); @Before public void instrumentLoggingForTesting() { loggingEvents.clear(); appender = new NullAppender() { @Override public void doAppend(LoggingEvent event) { loggingEvents.add(event); } }; Logger.getLogger(Appmon4jDumper.class).addAppender(appender); } @After public void clearLoggingInstrumentation() { loggingEvents.clear(); Logger.getLogger(Appmon4jDumper.class).removeAppender(appender); } @Test public void dumpContainsReportingValues() { InApplicationMonitor inApplicationMonitor = inApplicationMonitorRule.getInApplicationMonitor(); String counterName = "DummyCounter"; String timerName = "DummyTimer"; String stateValueName = "DummyStateValue"; inApplicationMonitor.incrementCounter(counterName); inApplicationMonitor.addTimerMeasurement(timerName, 42L); inApplicationMonitor.registerStateValue(new SimpleStateValueProvider(stateValueName, 42L)); Appmon4jDumper objectUnderTest = new Appmon4jDumper(inApplicationMonitorRule.getInApplicationMonitor()); objectUnderTest.onApplicationEvent(new ContextClosedEvent(new GenericApplicationContext())); assertThat(loggingEvents, Matchers.<LoggingEvent>hasItem( allOf( loggingEventWithMessageContaining(counterName), loggingEventWithMessageContaining(timerName), loggingEventWithMessageContaining(stateValueName)))); } private Matcher<? super LoggingEvent> loggingEventWithMessageContaining(String messagePart) { return new FeatureMatcher<LoggingEvent, String>(containsString(messagePart), "LoggingEvent having message being", "message") { @Override protected String featureValueOf(LoggingEvent actual) { return actual.getRenderedMessage(); } }; } }